1 Introducción

La desestacionalización es una técnica utilizada en el análisis de series temporales para eliminar las fluctuaciones periódicas y recurrentes que ocurren en intervalos específicos, conocidas como estacionalidad 1. Este proceso permite identificar y analizar las tendencias subyacentes y los componentes cíclicos de una serie temporal, facilitando una interpretación más clara de los datos económicos y financieros.

Estos patrones estacionales son movimientos repetitivos que se producen sistemáticamente a lo largo de la trayectoria de la serie y generalmente representan fluctuaciones que se registran de forma constante en periodos de tiempo, por lo general, inferiores al año (Eustat, 2006).

De acuerdo al Manual de Cuentas Nacionales Trimestrales de 2017, “el propósito de la desestacionalización es identificar y estimar los distintos componentes de una serie temporal, lo que permite entender mejor las tendencias subyacentes, el ciclo económico y los movimientos a corto plazo de la serie. Ofrece una perspectiva complementaria de los cambios recientes de las series macroeconómicas, que habilita la comparación entre trimestres sin la influencia de efectos estacionales o calendario.” (Fund & Department, 2018)

Este proceso de eliminación de efectos estacionales se realiza mediante técnicas analíticas que descomponen la serie en componentes dinámicos no observados, al hacerlo, se destacan las tendencias subyacentes a largo plazo y los movimientos a corto plazo de la serie. En la práctica es común manejar los patrones estacionales analizando las tasas de variación anual, comparando el trimestre actual con el mismo trimestre del año anterior, sin embargo, este enfoque puede tener algunas limitaciones como reflejar eventos desactualizados, no eliminar por completo los efectos de calendario o puede estar sesgado por cambios de comportamiento.

La desestacionalización es fundamental porque mejora la interpretación de las series temporales al eliminar fluctuaciones estacionales que pueden distorsionar el análisis, facilita la comparación de datos entre diferentes periodos al excluir patrones estacionales y permite generar proyecciones más precisas al basarse en tendencias reales.

El cuadro a continuación, describe cómo los usuarios suelen utilizar los datos:

Cuadro 1. Desestacionalización y que desean los usuarios

# Cargar librerías necesarias
library(tibble)
library(reactable)
#> Warning: package 'reactable' was built under R version 4.3.3
library(DT)
library(flextable)
#> Warning: package 'flextable' was built under R version 4.3.3
library(knitr)
#> Warning: package 'knitr' was built under R version 4.3.3

# Crear el dataframe con la información de la tabla
tabla_desestacionalizacion <- tribble(
  ~"Principal uso de los datos", ~"Componentes de interés", ~"Componentes de menor importancia",
  "Análisis del ciclo económico", "Componentes irregulares y de tendencia-ciclo", "Datos sin ajustar",
  "Detección de puntos de inflexión", "Componentes irregulares y de tendencia-ciclo", "Datos sin ajustar",
  "Pronósticos a corto y mediano plazo", "Series originales sin ajustar y todos sus componentes (tendencia-ciclo, irregulares, factores estacionales, factores previos al ajuste, etc.)", "",
  "Pronósticos a corto plazo de elementos estables, pero sumamente estacionales (como el consumo de electricidad)", "Factores estacionales más el componente de tendencia-ciclo", "",
  "Pronósticos a largo plazo", "Datos anuales y posiblemente el componente de tendencia-ciclo de los datos mensuales y trimestrales", "Datos mensuales y trimestrales sin ajustar, datos desestacionalizados y los componentes irregulares",
  "Análisis del efecto de determinados sucesos (como huelgas)", "El componente irregular y todo factor previo al ajuste", "",
  "Determinación de lo efectivamente ocurrido (pe, cuántas personas estuvieron desempleadas en noviembre)", "Series originales sin ajustar", "Datos desestacionalizados y de tendencia-ciclo",
  "Formulación de políticas", "Series originales sin ajustar y todos sus componentes (tendencia-ciclo, irregulares, factores estacionales, factores previos al ajuste, etc.)", "",
  "Creación de modelos macroeconómicos", "Podrían ser sin ajustar, ajustados, de tendencia-ciclo o todos los componentes, según el propósito principal del modelo", "",
  "Estimación de relaciones de comportamiento", "Podrían ser sin ajustar, ajustados, de tendencia-ciclo o todos los componentes, según el uso principal de las relaciones estimadas", "",
  "Edición y conciliación de datos a cargo de los compiladores de las estadísticas", "Series originales sin ajustar, datos desestacionalizados, componente irregular y tendencia-ciclo", ""
)

# Opción 1: Mostrar la tabla en formato reactable (dinámico y con diseño moderno)
reactable(tabla_desestacionalizacion, 
          striped = TRUE,  # Alternar colores en filas
          highlight = TRUE,  # Resaltar filas al pasar el mouse
          bordered = TRUE,  # Bordes en la tabla
          defaultPageSize = 10,  # Filas por página
          theme = reactableTheme(
            headerStyle = list(backgroundColor = "#0e3c78", color = "white", fontWeight = "bold")
          ))

1.1 Tipos de Estacionalidad

En las series temporales se pueden identificar los siguientes tipos de estacionalidad:

  • Estacionalidad Aditiva: Cuando la variación estacional es constante a lo largo del tiempo y se suma a la tendencia de la serie.

  • Estacionalidad Multiplicativa: Cuando la variación estacional es proporcional al nivel de la serie, es decir, se multiplica por la tendencia.

  • Estacionalidad Mixta: Combina características de las estacionalidades aditiva y multiplicativa.

1.2 Principios fundamentales de la desestacionalización

“El propósito de la desestacionalización es identificar y estimar los distintos componentes de una serie temporal y, así, ofrecer una idea más acabada de las tendencias subyacentes del ciclo económico y de los movimientos a corto plazo de la serie.” (Fund & Department, 2018)

Un requisito fundamental para aplicar procesos de desestacionalización es que la serie temporal muestre efectos estacionales claros y suficientemente estables. Además, es importante tener en cuenta que la desestacionalización constituye un análisis complementario de los datos originales, sin reemplazarlos.

Según el Manual de Cuentas Nacionales Trimestrales de 2017, la desestacionalización parte del supuesto de que una serie temporal está compuesta por cuatro elementos principales: i) tendencia-ciclo, ii) componente estacional, iii) componente calendario y iv) componente irregular. Estos componentes, al ser no observados, deben identificarse y estimarse a partir de la serie temporal mediante técnicas de extracción de señales.

  • Componente de tendencia-ciclo: Representa la evolución subyacente de la serie, integrando tanto la tendencia a largo plazo como las fluctuaciones del ciclo económico. La tendencia refleja cambios estructurales, como el crecimiento demográfico y los avances tecnológicos y de productividad. Por su parte, las variaciones cíclicas corresponden a las oscilaciones periódicas de las fases de la economía (recesión, recuperación, crecimiento y desaceleración).

  • Componente estacional: Agrupa las fluctuaciones que se repiten anualmente de manera similar en cuanto a momento, dirección y magnitud. Estas variaciones responden a factores como el clima, reglas administrativas, tradiciones sociales y culturales, además de efectos de calendario estables, como feriados públicos o festividades nacionales. Los cambios en cualquiera de estas causas pueden modificar el patrón estacional de la serie.

  • Componente calendario: Incluye los efectos asociados con las diferencias en las características del calendario entre períodos, los cuales pueden ser estacionales o no estacionales. Solo los efectos “no estacionales” se incorporan en este componente para un tratamiento separado, ya que los efectos “estacionales” son capturados por el componente estacional.

  • Componente irregular: Este componente incluye las fluctuaciones que no forman parte de la tendencia-ciclo, ni de los componentes estacional y calendario. Se caracteriza por su naturaleza impredecible, tanto en impacto como en duración, y suele estar asociado a eventos puntuales o extraordinarios que afectan temporalmente la serie, como desastres naturales, crisis económicas repentinas o cambios inesperados en políticas.

1.3 Métodos de Desestacionalización

El procedimiento de desestacionalización sigue un enfoque en dos etapas: preajuste y descomposición de la serie preajustada en componentes no observados. En la primera etapa, el objetivo del preajuste es seleccionar un modelo de regresión con errores ARIMA que describa adecuadamente las características de la serie original. Este proceso incluye la elección de: i) la relación entre los componentes no observados (aditivos, multiplicativos u otras formas mixtas), ii) el orden del modelo ARIMA, iii) los efectos calendario, y iv) los valores atípicos y otras variables de intervención.

En la segunda etapa, se descompone la serie preajustada en los componentes no observados. La serie ajustada para los efectos deterministas se divide en tres componentes: tendencia-ciclo, estacional e irregular.

Una vez estimados los componentes no observados, los factores de ajuste identificados en la primera etapa (efectos calendario, valores atípicos, etc.) se asignan a su componente correspondiente para obtener una descomposición completa de la serie original en sus componentes finales: tendencia-ciclo, estacional, calendario e irregular. La serie desestacionalizada se obtiene al eliminar los efectos estacionales y de calendario.

Existen varios métodos para desestacionalizar series temporales, entre los más utilizados se encuentran:

  • X13-ARIMA: Desarrollado por el U.S. Census Bureau, este programa combina las capacidades de los métodos X-11 y la descomposición con modelos ARIMA para la desestacionalización de series temporales. Es ampliamente utilizado por instituciones estadísticas y bancos centrales debido a su robustez y flexibilidad (Hernández, 2013) (Eurostat, 2024) (Bureau, 2023) (Labor Statistics, 2023).

  • TRAMO-SEATS: Desarrollado por el Banco de España, TRAMO (Time Series Regression with ARIMA Noise, Missing Observations and Outliers) se encarga del pre-procesamiento de las series temporales, mientras que SEATS (Signal Extraction in ARIMA Time Series) realiza la descomposición de la serie en componentes no observables. Este método es utilizado por diversas instituciones europeas para el ajuste estacional de series económicas. (Eustat, 2006) (Knox & Smal, 2023) ((UNIDO), 2024).

1.4 Uso Internacional de Métodos de Desestacionalización

Diversos países e instituciones utilizan estos métodos para el ajuste estacional de sus series temporales:

Estados Unidos: Utiliza principalmente el X13-ARIMA-SEATS para la desestacionalización de datos económicos (Hernández, 2013).

Países de la Unión Europea: Emplean TRAMO-SEATS y, en algunos casos, X13-ARIMA-SEATS, siguiendo las recomendaciones de Eurostat para garantizar la comparabilidad de las estadísticas económicas (Eustat, 2006).

Chile. El Banco Central de Chile publica datos originales y desestacionalizados del Producto Interno Bruto (PIB) y del Índice Mensual de Actividad Económica (IMACEC). En informes como “Cuentas Nacionales de Chile: Evolución de la actividad económica” y el “Informe de Política Monetaria”, se utilizan datos desestacionalizados, analizando las variaciones trimestrales. Para el IMACEC, se examinan tanto la serie original como la desestacionalizada. (Chile, 2024b) (Chile, 2024a)

En cuanto a la interpretación, la serie desestacionalizada del IMACEC se compara con el mes anterior, mientras que, en el caso del PIB desestacionalizado, la comparación se realiza con el trimestre previo.

México. El Banco de México publica series originales y desestacionalizadas del PIB, basándose en datos del Instituto Nacional de Estadística y Geografía (INEGI) y otras fuentes. Informes como el “Informe trimestral” y el “Reporte sobre las economías regionales” analizan principalmente series ajustadas por estacionalidad elaboradas por el propio banco. El análisis de las series desestacionalizadas se realiza generalmente en comparación con el periodo inmediato anterior. (México, 2024)

Brasil. El Instituto Brasileño de Geografía y Estadística (IBGE) utiliza el método X13-ARIMA para desestacionalizar sus series, tal como se detalla en el manual de estadísticas trimestrales. Indicadores como el PIB ajustado se publican en informes trimestrales, como “Indicadores IBGE: Contas Nacionais Trimestrais”, que presentan tanto las series desestacionalizadas como cálculos de variación con las series originales. El análisis de las series desestacionalizadas se realiza comparando con el trimestre anterior. (Geografia e Estatística (IBGE), 2016) (Geografia e Estatística (IBGE), 2024)

Argentina. El Instituto Nacional de Estadística y Censos (INDEC) publica series originales y desestacionalizadas del PIB y del Estimador Mensual de la Actividad Económica (EMAE), disponibles en su sitio web junto con la metodología utilizada. Según el informe “Cuentas Nacionales. Estimador mensual de actividad económica”, la serie desestacionalizada se analiza en relación con el mes anterior, complementando el análisis con observaciones sobre la serie original. (Estadística y Censos (INDEC), 2025)

2 Metodología

El método X-13ARIMA-SEATS 2 es ampliamente reconocido y utilizado por países, bancos centrales e instituciones estadísticas a nivel regional e internacional.

2.1 Metodología de X-13ARIMA-SEATS

El método X-13ARIMA-SEATS, desarrollado por el U.S. Census Bureau, es una herramienta ampliamente utilizada por instituciones estadísticas y bancos centrales para el ajuste estacional y análisis de series temporales. Este enfoque permite descomponer las series en componentes principales como tendencia-ciclo, estacionalidad e irregularidad, facilitando una interpretación más clara de los datos económicos y financieros. El proceso incluye un preprocesamiento para corregir valores atípicos y ajustar por efectos de calendario, seguido de un modelado ARIMA para capturar las dependencias temporales y estacionales. Finalmente, la serie se ajusta eliminando las fluctuaciones estacionales, proporcionando datos más limpios para el análisis de tendencias reales.

Los detalles técnicos, como el funcionamiento del modelado ARIMA, las fórmulas específicas de descomposición y los diagnósticos utilizados para evaluar la calidad del ajuste, se describen en el Apéndice. Esta sección incluye una explicación detallada de las etapas del método, junto con ejemplos prácticos que ilustran su aplicación en datos económicos y financieros.

3 Aplicación

3.1 Desestacionalización de IGAE

invisible(sapply(dev.list(), dev.off))
rm(list = ls())
library(seasonal)
library(writexl)
library(openxlsx)
library(readxl)
library(dplyr)
datos <- read_excel("data_selected.xlsx", sheet = "data1992")
datos <- datos %>% select(-date)
serie_ts <- ts(datos, start = c(1990, 1), frequency = 12)
serie_igae <- ts(datos$igae, start = c(1990, 1), frequency = 12)

3.1.1 Gráfico estacional por mes del IGAE

library(plotly)  
#> Warning: package 'plotly' was built under R version 4.3.3
#> Loading required package: ggplot2
#> 
#> Attaching package: 'plotly'
#> The following object is masked from 'package:ggplot2':
#> 
#>     last_plot
#> The following objects are masked from 'package:flextable':
#> 
#>     highlight, style
#> The following object is masked from 'package:stats':
#> 
#>     filter
#> The following object is masked from 'package:graphics':
#> 
#>     layout
library(forecast)
#> Warning: package 'forecast' was built under R version 4.3.3
#> Registered S3 method overwritten by 'quantmod':
#>   method            from
#>   as.zoo.data.frame zoo
library(dplyr)  

# Crear una secuencia de fechas mensuales desde enero de 1990 hasta diciembre de 2024

# Crear una serie temporal (ts) a partir de los datos simulados
values = datos$igae

# Crear rango de fechas desde enero de 1990 hasta junio de 2024
time <- seq.Date(from = as.Date("1990-01-01"), to = as.Date("2024-06-01"), by = "month")

# Crear una serie temporal (ts) a partir de los datos simulados
values_ts <- ts(values, start = c(1990, 1), frequency = 12)

# Convertir los valores en una serie temporal con frecuencia mensual
values_df <- data.frame(Date = time, Value = as.numeric(values))

# Crear un gráfico interactivo usando plotly
fig_line <- plot_ly(
  data = values_df,
  x = ~Date,
  y = ~Value,
  type = 'scatter',
  mode = 'lines',
  line = list(color = '#0e9433')
) %>%
  layout(
    title = "Monthly Economic Activity Index (1990:Jan.-2024:Jun.)",
    xaxis = list(title = "Period"),
    yaxis = list(title = "Index (1990=100)"),
    template = "plotly_white"
  )

fig_line

# Calcular los promedios mensuales
data <- data.frame(
  Month = factor(rep(month.abb, length.out = length(time)), levels = month.abb, ordered = TRUE),
  # Crear una columna de meses como factores ordenados (de enero a diciembre)
  Year = format(time, "%Y"),  # Extraer los años directamente desde el rango de fechas
  Value = values  # Asignar los valores simulados
)

monthly_means <- data %>%
  group_by(Month) %>%  # Agrupar datos por mes
  summarise(Mean_Value = mean(Value))  # Calcular el promedio de los valores para cada mes

# Preparar los datos para plotly
plot_data <- data %>%
  mutate(Month_Num = as.numeric(Month)) 
# Agregar una columna con los meses como números para usarlos en las escalas de plotly

# Crear el gráfico con plotly
fig <- plot_ly()  # Inicializar un objeto de gráfico vacío

# Añadir líneas para cada año
for (year in unique(plot_data$Year)) {  # Iterar sobre cada año único
  fig <- fig %>%
    add_trace(
      data = plot_data %>% filter(Year == year),  # Filtrar los datos para el año actual
      x = ~Month_Num,  # Mes en formato numérico como eje X
      y = ~Value,  # Valores simulados como eje Y
      type = 'scatter',  # Tipo de gráfico: dispersión
      mode = 'lines',  # Mostrar las líneas conectadas
      name = paste("Year", year),  # Nombre de la línea según el año
      line = list(width = 1.5)  # Grosor de la línea
    )
}

# Añadir puntos para los promedios mensuales
fig <- fig %>%
  add_trace(
    data = monthly_means,  # Usar los datos de promedios mensuales
    x = ~as.numeric(Month),  # Mes como numérico para alinearse con las líneas
    y = ~Mean_Value,  # Promedios mensuales como eje Y
    type = 'scatter',  # Tipo de gráfico: dispersión
    mode = 'markers',  # Mostrar solo los puntos
    name = 'Monthly Averages',  # Nombre de la capa
    marker = list(size = 10, color = '#0e1b87', symbol = 'circle')  # Estilo de los puntos (color y tamaño)
  )

# Ajustar diseño del gráfico
fig <- fig %>%
  layout(
    title = "Seasonal Plot with Monthly Averages (Grouped by Year and Month)",  # Título del gráfico
    xaxis = list(
      title = "Month",  # Etiqueta del eje X
      tickvals = 1:12,  # Posiciones de los ticks en el eje X (meses)
      ticktext = month.abb  # Texto de los ticks: nombres abreviados de los meses
    ),
    yaxis = list(title = "Index (1990=100)"),  # Etiqueta del eje Y
    legend = list(orientation = "h", x = 0.5, xanchor = "center"),  # Posición horizontal de la leyenda
    template = "plotly_white"  # Tema visual blanco para un diseño limpio
  )

# Mostrar el gráfico
fig  # Mostrar el gráfico interactivo
modelo_desestacionalizado <- seas(serie_igae 
                                  #x11 = "", 
                                  #x11.mode = "mult",
                                  #x11.mode = "add",
                                  #transform.function = "log"
                                  #transform.function = "none"
                                  )
summary(modelo_desestacionalizado)
#> 
#> Call:
#> seas(x = serie_igae)
#> 
#> Coefficients:
#>                    Estimate Std. Error z value Pr(>|z|)    
#> Constant           0.038943   0.002075  18.764  < 2e-16 ***
#> Easter[1]         -0.006647   0.001954  -3.401 0.000671 ***
#> AO2004.Dec         0.049990   0.010228   4.887 1.02e-06 ***
#> AO2005.Dec         0.090953   0.010228   8.892  < 2e-16 ***
#> AO2019.Nov        -0.063989   0.009562  -6.692 2.20e-11 ***
#> LS2020.Mar        -0.072664   0.011854  -6.130 8.80e-10 ***
#> LS2020.Apr        -0.257140   0.012042 -21.353  < 2e-16 ***
#> AO2020.Jun        -0.049826   0.012070  -4.128 3.66e-05 ***
#> LS2020.Jun         0.171939   0.014888  11.549  < 2e-16 ***
#> LS2020.Sep         0.056309   0.011586   4.860 1.17e-06 ***
#> AO2022.Nov        -0.048208   0.009697  -4.971 6.65e-07 ***
#> AR-Nonseasonal-01  0.121882   0.608210   0.200 0.841171    
#> AR-Nonseasonal-02  0.464035   0.441270   1.052 0.292988    
#> MA-Nonseasonal-01 -0.594655   0.618366  -0.962 0.336223    
#> MA-Seasonal-12     0.284759   0.048753   5.841 5.19e-09 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> SEATS adj.  ARIMA: (2 0 1)(0 1 1)  Obs.: 414  Transform: log
#> AICc:  2007, BIC:  2069  QS (no seasonality in final):    0  
#> Box-Ljung (no autocorr.): 29.92   Shapiro (normality): 0.9839 ***
# Extraer la serie desestacionalizada
serie_desestacionalizada <- final(modelo_desestacionalizado)
# Instalar y cargar plotly si no lo tienes
# install.packages("plotly")
library(plotly)

# Crear un data frame para plotly
# Instalar y cargar plotly si no lo tienes
# install.packages("plotly")
library(plotly)

# Crear un data frame para plotly
data <- data.frame(
  Tiempo = seq_along(serie_igae),
  Original = serie_igae,
  Desestacionalizada = serie_desestacionalizada
)

# Crear el gráfico con fondo blanco y sin rejillas
fig <- plot_ly(data, x = ~Tiempo) %>%
  add_lines(y = ~Original, name = "Original", 
            line = list(color = "rgba(0, 0, 128, 1)", width = 3)) %>% # Azul marino
  add_lines(y = ~Desestacionalizada, name = "Desestacionalizada", 
            line = list(color = "rgba(128, 128, 128, 1)", width = 3)) %>% # Gris
  layout(
    title = list(
      text = "IGAE General - Serie Original vs Desestacionalizada", 
      font = list(family = "Times New Roman", size = 18)
    ),
    xaxis = list(
      title = "Tiempo", 
      showgrid = FALSE, # Sin rejillas en el eje X
      font = list(family = "Times New Roman")
    ),
    yaxis = list(
      title = "Valor", 
      showgrid = FALSE, # Sin rejillas en el eje Y
      font = list(family = "Times New Roman")
    ),
    legend = list(
      font = list(family = "Times New Roman", size = 12)
    ),
    plot_bgcolor = "rgba(255, 255, 255, 1)", # Fondo blanco
    paper_bgcolor = "rgba(255, 255, 255, 1)" # Fondo del papel blanco
  )

# Mostrar el gráfico
fig

3.2 Desestacionalización de los componentes del IGAE

# Cargar librerías necesarias
library(seasonal)
library(readxl)
library(writexl)

# Importar datos desde Excel
datos <- read_excel("data_selected.xlsx", sheet = "data1992")

# Crear series de tiempo individuales
serie_igae <- ts(datos$igae, start = c(1990, 1), frequency = 12)
serie_igae_agri <- ts(datos$igae_agri, start = c(1990, 1), frequency = 12)
serie_igae_pet <- ts(datos$igae_pet, start = c(1990, 1), frequency = 12)
serie_igae_min <- ts(datos$igae_min, start = c(1990, 1), frequency = 12)
serie_igae_ind <- ts(datos$igae_ind, start = c(1990, 1), frequency = 12)
serie_igae_ele <- ts(datos$igae_ele, start = c(1990, 1), frequency = 12)
serie_igae_cons <- ts(datos$igae_cons, start = c(1990, 1), frequency = 12)

serie_igae_com <- ts(datos$igae_com, start = c(1990, 1), frequency = 12)
serie_igae_tran <- ts(datos$igae_tran, start = c(1990, 1), frequency = 12)
serie_igae_comu <- ts(datos$igae_comu, start = c(1990, 1), frequency = 12)
serie_igae_serv <- ts(datos$igae_serv, start = c(1990, 1), frequency = 12)
serie_igae_pub <- ts(datos$igae_pub, start = c(1990, 1), frequency = 12)
serie_igae_otrserv <- ts(datos$igae_otrserv, start = c(1990, 1), frequency = 12)

# igae + 12 activities  
# igae_agri igae_pet    igae_min    
# igae_ind igae_ele igae_cons   
# igae_com  igae_tran   igae_comu   
# igae_serv igae_pub    igae_otrserv

# Aplicar desestacionalización individualmente
#modelo_igae <- seas(serie_igae, x11 = "", transform.function = "log")
#modelo_igae_agri <- seas(serie_igae_agri, x11 = "", transform.function = "log")
#modelo_igae_pet <- seas(serie_igae_pet, x11 = "", transform.function = "log")
#modelo_igae_min <- seas(serie_igae_min, x11 = "", transform.function = "log")

modelo_igae <- seas(serie_igae, x11 = "", transform.function = "auto", outlier = "")

modelo_igae_agri <- seas(serie_igae_agri, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_pet <- seas(serie_igae_pet, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_min <- seas(serie_igae_min, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_ind <- seas(serie_igae_ind, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_ele <- seas(serie_igae_ele, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_cons <- seas(serie_igae_cons, x11 = "", transform.function = "auto", outlier = "")

modelo_igae_com <- seas(serie_igae_com, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_tran <- seas(serie_igae_tran, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_comu <- seas(serie_igae_comu, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_serv <- seas(serie_igae_serv, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_pub <- seas(serie_igae_pub, x11 = "", transform.function = "auto", outlier = "")
modelo_igae_otrserv <- seas(serie_igae_otrserv, x11 = "", transform.function = "auto", outlier = "")


# Extraer series desestacionalizadas
igae_desest <- final(modelo_igae)
igae_agri_desest <- final(modelo_igae_agri)
igae_pet_desest <- final(modelo_igae_pet)
igae_min_desest <- final(modelo_igae_min)
igae_ind_desest <- final(modelo_igae_ind)
igae_ele_desest <- final(modelo_igae_ele)
igae_cons_desest <- final(modelo_igae_cons)

igae_com_desest <- final(modelo_igae_com)
igae_tran_desest <- final(modelo_igae_tran)
igae_comu_desest <- final(modelo_igae_comu)
igae_serv_desest <- final(modelo_igae_serv)
igae_pub_desest <- final(modelo_igae_pub)
igae_otrserv_desest <- final(modelo_igae_otrserv)

# Crear un nuevo dataframe con las series desestacionalizadas
datos_desest <- data.frame(
  date = seq.Date(from = as.Date("1990-01-01"), by = "month", length.out = length(igae_desest)),
  igae_desest = igae_desest,
  igae_agri_desest = igae_agri_desest,
  igae_pet_desest = igae_pet_desest,
  igae_min_desest = igae_min_desest,
  igae_ind_desest = igae_ind_desest,
  igae_ele_desest = igae_ele_desest,
  igae_cons_desest = igae_cons_desest,
  igae_com_desest = igae_com_desest,
  igae_tran_desest = igae_tran_desest,
  igae_comu_desest = igae_comu_desest,
  igae_serv_desest = igae_serv_desest,
  igae_pub_desest = igae_pub_desest,
  igae_otrserv_desest = igae_otrserv_desest
)

# Guardar resultados desestacionalizados en un archivo Excel
write_xlsx(datos_desest, "series_desestacionalizadas.xlsx")
#rm(list = ls())
library(seasonal)
library(readxl)
library(writexl)

datos <- read_excel("data_selected.xlsx", sheet = "data1992")
serie_igae_agri <- ts(datos$igae_agri, start = c(1990, 1), frequency = 12)
modelo_igae_agri <- seas(serie_igae_agri, x11 = "")
#modelo_igae_agri <- seas(serie_igae_agri, x11 = "", transform.function = "auto")
#modelo_igae_agri <- seas(serie_igae_agri, x11 = "", transform.function = "auto", regression.aictest = c("td", "easter"))
#modelo_igae_agri <- seas(serie_igae_agri, x11 = "", transform.function = "auto", outlier = TRUE)


summary(modelo_igae_agri)
#> 
#> Call:
#> seas(x = serie_igae_agri, x11 = "")
#> 
#> Coefficients:
#>                   Estimate Std. Error z value Pr(>|z|)    
#> LS1992.Jan        -0.08656    0.01427  -6.066 1.31e-09 ***
#> LS1998.Jan        -0.07947    0.01398  -5.684 1.32e-08 ***
#> AO2007.Feb        -0.07540    0.01451  -5.195 2.04e-07 ***
#> AR-Nonseasonal-01  0.58343    0.04488  13.000  < 2e-16 ***
#> MA-Nonseasonal-01  0.96829    0.01339  72.328  < 2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> X11 adj.  ARIMA: (1 1 1)(0 1 0)  Obs.: 414  Transform: log
#> AICc:  2267, BIC:  2291  QS (no seasonality in final):36.35 ***
#> Box-Ljung (no autocorr.): 21.56   Shapiro (normality): 0.9811 ***
# Cargar librerías necesarias
library(plotly)
library(readxl)
library(dplyr)

# Importar datos desestacionalizados desde Excel
datos_desest <- read_excel("series_desestacionalizadas.xlsx")

# Convertir la columna de fechas a formato Date
datos_desest$date <- as.Date(datos_desest$date)

# Crear un gráfico vacío
fig <- plot_ly()

# Iterar sobre todas las columnas excepto 'date' y añadir cada serie como línea
for (col in names(datos_desest)[-1]) {  # Excluye la columna 'date'
  fig <- fig %>%
    add_trace(
      x = datos_desest$date,
      y = datos_desest[[col]],  # Acceder correctamente a los valores de cada serie
      type = 'scatter',
      mode = 'lines',
      name = col,  # Nombre de la serie en la leyenda
      line = list(width = 1.2)  # Grosor de la línea
    )
}

# Configuración del diseño del gráfico
fig <- fig %>%
  layout(
    title = "Desestacionalización de Índices de Actividad Económica (1990:Jan.-2024:Jun.)",
    xaxis = list(title = "Periodo"),
    yaxis = list(title = "Índice (1990=100)"),
    template = "plotly_white",
    legend = list(
      orientation = "h",  # Leyenda horizontal
      x = 0.5, xanchor = "center", y = -0.2
    ),
    hovermode = "x unified"
  )

# Mostrar el gráfico interactivo
fig

3.3 Tabla Resumen

# Cargar librerías
library(DT)
library(readxl)
library(dplyr)

# Cargar los datos
datos_desest <- read_excel("series_desestacionalizadas.xlsx")

# Convertir fechas si es necesario
datos_desest$date <- as.Date(datos_desest$date)

# Redondear todas las columnas numéricas a 3 decimales
datos_desest <- datos_desest %>%
  mutate(across(where(is.numeric), ~ round(., 3)))

# Mostrar tabla interactiva con encabezado azul marino
datatable(
  datos_desest,
  extensions = 'Buttons',
  options = list(
    pageLength = 10,
    dom = 'Bfrtip',
    buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),
    initComplete = JS(
      "function(settings, json) {",
      "$('thead').css({'background-color': '#0e3c78', 'color': 'white'});",  # Fondo azul marino y texto blanco
      "}"
    )
  ),
  rownames = FALSE
)

4 Apéndice

4.1 Apéndice: Metodología Detallada de X-13ARIMA-SEATS

Este apéndice presenta los detalles técnicos y metodológicos del método X-13ARIMA-SEATS.3

4.1.1 1. Preprocesamiento de la Serie Temporal

Antes de realizar el ajuste estacional, la serie pasa por un preprocesamiento para corregir anomalías y preparar los datos:

4.1.1.1 a) Detección y Tratamiento de Valores Atípicos

  • Tipos de outliers detectados:
    • Saltos temporales (additive outliers, AO).
    • Cambios estructurales (level shifts, LS).
    • Cambios temporales en la pendiente (temporary changes, TC).
  • Los outliers se identifican y corrigen mediante ajustes de regresión.

4.1.1.2 b) Corrección por Efectos de Calendario

  • Ajustes realizados para considerar efectos de calendario como:
    • Diferencias en el número de días por mes (ej., meses bisiestos).
    • Efectos específicos de días festivos o eventos recurrentes.

4.1.1.3 c) Transformación de la Serie

  • Se selecciona entre un modelo aditivo o multiplicativo, dependiendo de las características de la serie.
  • Si la variabilidad estacional depende del nivel de la serie, se aplica una transformación logarítmica para estabilizar la varianza.

4.2 2. Modelado ARIMA

El componente ARIMA captura las dependencias temporales de la serie:

4.2.1 a) Identificación del Modelo

  • Se utiliza un modelo ARIMA (p,d,q)(P,D,Q)[s], donde:
    • \(p, P\): Orden de los términos autorregresivos.
    • \(d, D\): Diferenciaciones necesarias para hacer la serie estacionaria.
    • \(q, Q\): Orden de los términos de medias móviles.
    • \(s\): Periodicidad estacional (ej., 12 para datos mensuales).

4.2.2 b) Estimación del Modelo

  • Los parámetros del modelo se estiman mediante métodos numéricos, como la máxima verosimilitud.

4.3 3. Descomposición de la Serie Temporal

La serie se descompone en tres componentes principales:

4.3.1 a) Componentes Estimados

  • Tendencia-Ciclo (T): Captura movimientos de largo plazo.
  • Estacionalidad (S): Refleja fluctuaciones periódicas.
  • Irregularidad (I): Representa ruido o variabilidad no estructurada.

4.3.2 b) Métodos de Descomposición

  • Dependiendo de la naturaleza de los datos, se utiliza uno de los siguientes modelos:
    • Aditivo: La serie es la suma de sus componentes.
    • Multiplicativo: La serie es el producto de sus componentes.
    • Logarítmico: Transformación logarítmica aplicada a series multiplicativas.

4.4 4. Ajuste Estacional

Se elimina el componente estacional (\(S\)) para obtener la serie ajustada estacionalmente:

4.4.1 a) Serie Ajustada Estacionalmente

  • Para modelos aditivos: La estacionalidad se elimina mediante la resta.
  • Para modelos multiplicativos: La estacionalidad se elimina mediante la división.

4.4.2 b) Validación del Ajuste

  • Se verifica que no queden patrones estacionales residuales en la serie ajustada.
  • La serie ajustada debe ser adecuada para el análisis de tendencias económicas.

4.5 5. Diagnósticos y Evaluación

X-13ARIMA-SEATS incluye herramientas para evaluar la calidad del ajuste:

4.5.1 a) Evaluación de la Serie Ajustada

  • Análisis de residuos para garantizar que:
    • Los residuos sean ruido blanco.
    • No queden patrones estacionales.

4.5.2 b) Medidas de Calidad

  • Fuerza Estacional: Evalúa la eliminación efectiva de la estacionalidad.
  • Errores Relativos: Mide la precisión del ajuste.

4.5.3 c) Visualización de Resultados

  • Gráficos que muestran la serie original, la ajustada estacionalmente y los residuos.

Este apéndice presenta los detalles técnicos y metodológicos del método X-13ARIMA-SEATS. Para más información, consulte la documentación oficial del U.S. Census Bureau.


Referencias

Bureau, U. S. C. (2023). Time series and seasonal adjustment. https://www.census.gov/topics/research/seasonal-adjustment.html
Chile, B. C. de. (2024a). Cuentas nacionales de chile: Evolución de la actividad económica tercer trimestre. Año 2024. Banco Central de Chile. https://www.bcentral.cl/areas/estadisticas/cuentas-nacionales-trimestrales
Chile, B. C. de. (2024b). Informe de política monetaria, diciembre 2024. Banco Central de Chile. https://www.bcentral.cl/areas/politica-monetaria/informe-de-politica-monetaria
Estadística y Censos (INDEC), I. N. de. (2025). Cuentas nacionales. Vol. 9, nº 2 - estimador mensual de actividad económica: Estimación preliminar de noviembre de 2024. INDEC.
Eurostat. (2024). ESS guidelines on seasonal adjustment – 2024 edition. https://ec.europa.eu/eurostat/web/products-manuals-and-guidelines/w/ks-gq-24-012
Eustat. (2006). Corrección y desestacionalización de series coyunturales. Nota metodológica. https://www.eustat.eus/estandar_de_eustat_para_el_tratamiento_de_series_temporales_c.pdf
Fund, I. M., & Department, I. M. Fund. S. (2018). Quarterly national accounts manual (2017th ed.). International Monetary Fund.
Geografia e Estatística (IBGE), I. B. de. (2016). Contas nacionais trimestrais: Ano de referência 2010 (3rd ed., Vol. 28, p. 72). IBGE.
Geografia e Estatística (IBGE), I. B. de. (2024). Contas nacionais trimestrais: Indicadores de volume e valores correntes, jan.-mar. 2024. IBGE. https://biblioteca.ibge.gov.br/index.php/biblioteca-catalogo?view=detalhes&id=72121
Hernández, S. (2013). El x-13 ARIMA-SEATS como método de desestacionalización. Notas Económicas, 68. https://www.secmca.org/nota/el-x-13-arima-seats-como-metodo-de-desestacionalizacion/
Knox, S., & Smal, M. (2023). The seasonal adjustment methodology applied to economic statistics by the south african reserve bank. Quarterly Bulletin, 99–110. https://www.resbank.co.za/content/dam/sarb/publications/quarterly-bulletins/articles-and-notes/2023/03The%20seasonal%20adjustment%20methodology%20applied%20to.pdf
Labor Statistics, U. S. B. of. (2023). Seasonal adjustment in the CPI. https://www.bls.gov/cpi/seasonal-adjustment/
México, B. de. (2024). Informe trimestral julio-septiembre 2024. Banco de México. https://www.banxico.org.mx/publicaciones-y-prensa/informes-trimestrales/informes-trimestrales-precios.html
(UNIDO), U. N. I. D. O. (2024). Seasonal adjustment. https://stat.unido.org/portal/storage/file/publications/seasonal_adjustment/seasonal_adjustment-pdf.pdf

  1. Un factor estacional es un patrón que se repite en una serie de tiempo a intervalos regulares (por ejemplo, mensual, trimestral o anual). Este fenómeno ocurre debido a eventos recurrentes o características cíclicas en la economía, la sociedad o los mercados financieros. Estos factores afectan sistemáticamente los valores de la serie en ciertos períodos del tiempo.↩︎

  2. Desarrollado por el U.S. Census Bureau para el ajuste estacional y análisis de series temporales.↩︎

  3. Para más información, consulte la documentación oficial del U.S. Census Bureau.↩︎